MyBatis 03

您所在的位置:网站首页 mybatis resultmap resulttype MyBatis 03

MyBatis 03

#MyBatis 03 | 来源: 网络整理| 查看: 265

MyBatis映射1 ORM映射1.1 MyBatis自动ORM失效1.2 方案一:列的别名1.3 方案二:直接使用Map集合映射结果1.4 方案三:自定义结果映射(ResultMap)2 MyBatis高级映射2.1 数据库中表的关系2.2 OneToOne2.2.1 方案一:返回Map2.2.2 方案二:实体类关联2.2.3 方案三:分步查询2.3 OneToMany2.3.1 方案一:返回Map2.3.2 方案二:实体类关联2.3.3 方案三:分步查询2.4 ManyToMany2.4.1 方案一:实体类关联8.4.2 方案二:分步查询 1 ORM映射 1.1 MyBatis自动ORM失效

MyBatis只能自动维护库表”列名“与”属性名“相同时的一一对应关系,二者不同时,无法自动ORM。

1.2 方案一:列的别名

在SQL中使用 as 为查询字段添加列别名,以匹配属性名

select p_id pid,t_id tid,p_name name,p_time time,p_price price ,p_state state ,p_image image, p_info info,isdel del from product; 1.3 方案二:直接使用Map集合映射结果

常用的java类,mybatis已经取了类型别名了

不用写成

select * from product; //解决方法2:直接返回一个Map集合 List getAll2(); 1.4 方案三:自定义结果映射(ResultMap) select * from product; 2 MyBatis高级映射

全局懒加载

association 一对一的关联映射 property:实体类中属性名称(在Person类中定义的Passport属性的名称) javaType:映射对应java类型

collection:一对多的关联映射 property:关联的实体类中的集合的属性名 ofType: 集合泛型的类型

2.1 数据库中表的关系

实体间的关系:关联关系

OneToOne:一对一关系(person— passport)

OneToMany:一对多关系(dept— emp)

多对一(多个一对一)

ManyToMany:多对多关系(student— teacher) 多个一对多

2.2 OneToOne

SQL参考person表和passport表

三种实现方案

直接返回一个Map集合实体类中进行关联,mapper中做映射分步查询,实现懒加载(了解) 2.2.1 方案一:返回Map

映射代码

//1、直接将连表查询的结果映射到Map中(写一个公共类(将两个表的写到一个新的类中)) (一般不推荐这样操作) List getAll1(); select * from person p INNER JOIN passport pp on p.pid = pp.id; 2.2.2 方案二:实体类关联

实体类关联

@Data @AllArgsConstructor @NoArgsConstructor public class Person {private Integer id;private String name;private Integer age;private String phone;private String pid;private Passport passport; }

映射代码

select p.*,pp.id p_id,pp.info,pp.fromAdd ,pp.toAdd , pp.uid from person p INNER JOIN passport pp on p.pid = pp.id; 注意:指定“一方”关系时(对象),使用< association property=“” javaType=“” > 2.2.3 方案三:分步查询

实体类关联

@Data @AllArgsConstructor @NoArgsConstructor public class Person {private Integer id;private String name;private Integer age;private String phone;private String pid;private Passport passport; }

映射代码

select * from person select * from passport where id = #{pid} 可以使用两次查询也可以解决 2.3 OneToMany

SQL参考emp表和dept表

2.3.1 方案一:返回Map //此方式不适合一对多的查询情况 2.3.2 方案二:实体类关联

实体类关联

@Data @AllArgsConstructor @NoArgsConstructor public class Dept {private Integer deptno;private String dname;private String location;//一对多private List empList; }

映射代码

select * from dept d INNER JOIN emp e on d.deptno = e.deptno; 2.3.3 方案三:分步查询

实体类关联

@Data @AllArgsConstructor @NoArgsConstructor public class Dept {private Integer deptno;private String dname;private String location;//一对多private List empList; }

映射代码

select * from dept;select * from emp where deptno = #{deptno} 注意:指定“多方”关系时(集合),使用< collection ofType=“” property=“” > 2.4 ManyToMany

SQL参考student表和teacher表

2.4.1 方案一:实体类关联

实体类关联

@Data @AllArgsConstructor @NoArgsConstructor public class Student {private Integer id;private String name;private Double score;private List teacherList; }

映射代码

select s.id sid,s.name sname , s.score score , t.* from student s INNER JOIN t_s ts on s.id = ts.sid INNER JOIN teacher t on t.id = ts.tid 8.4.2 方案二:分步查询

与上面一对多的分步查询一致

注意:连表查询的时候,如果两张表有同名字段,在写sql语句的时候要取别名



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3